/**
 * 
 */
package net.vmiranda.jeds.web.tareas;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import net.vmiranda.jeds.core.proyectos.CategoriaProyecto;
import net.vmiranda.jeds.core.proyectos.Proyecto;
import net.vmiranda.jeds.core.proyectos.ProyectosManager;
import net.vmiranda.jeds.core.tareas.BusquedaTarea;
import net.vmiranda.jeds.core.tareas.NotaTarea;
import net.vmiranda.jeds.core.tareas.Prioridad;
import net.vmiranda.jeds.core.tareas.ResultadoConsultaTarea;
import net.vmiranda.jeds.core.tareas.Tarea;
import net.vmiranda.jeds.core.tareas.TareasManager;
import net.vmiranda.jeds.core.usuarios.Usuario;
import net.vmiranda.jeds.utils.modulos.DataModel;
import net.vmiranda.jeds.utils.modulos.EstadoModulo;
import net.vmiranda.jeds.utils.modulos.Modulo;
import net.vmiranda.jeds.web.util.Params;
import net.vmiranda.jeds.web.util.Sesion;

/**
 * @author victor
 *
 */
public class MBTarea extends Modulo<Tarea, ResultadoConsultaTarea> {
	
	private TareasManager tm;
	private ProyectosManager pm;
	
	
	private String textoActualNota;
	
	

	public MBTarea() {
		tm = new TareasManager();
		pm = new ProyectosManager();
		Object idTarea = Params.get("idTarea");
		//si hay id quiere decir que hay que abrir en otro modo
		if(idTarea != null){


			setEstado(EstadoModulo.BUSQUEDA);
			getBusqueda().setNombreTarea("ou");
			aceptarBusqueda();
		}
	}

	public BusquedaTarea getBusqueda(){
		if(busqueda == null){
			busqueda = new BusquedaTarea();
		}
		return (BusquedaTarea)busqueda;
	}


	public DataModelTareas getDataModel(){
		if(dataModelActivo == null){
			dataModelActivo = new DataModelTareas(10,getBusqueda());			
		}
		return (DataModelTareas) dataModelActivo;
	}

	@Override
	public Tarea getData(){
		return super.getData();
	}


	@Override
	public Tarea obtenerElemento(ResultadoConsultaTarea res) {
		
		return tm.tarea(res.getIdTarea());
	}
	
	@Override
	public Tarea modificar(Tarea t){
		Tarea modificada = null;
		
		try{
			t.setFechaModificacion(new Date());
			modificada = tm.modificar(t);			
		}catch(IllegalStateException ex){
			 FacesMessage fm = new FacesMessage("Field is Empty");
	         FacesContext.getCurrentInstance().addMessage("Field is Empty", fm);

			throw new IllegalStateException("tarea mal formada",ex);
		}
		return modificada;
	}


	public Tarea insertar(Tarea t){
		t.setFechaAlta(new Date());
		t.setFechaModificacion(new Date());
		return tm.insertarTarea(t);
	}

	@Override
	protected DataModel<ResultadoConsultaTarea> buscar() {
		DataModelTareas dtmNuevo = new DataModelTareas(10,getBusqueda());
		return dtmNuevo;
	}
	
	public List<SelectItem> getProyectosUI(){
		List<Proyecto> lista = pm.proyectosByUser(Sesion.getUsuario());
		List<SelectItem> listaUI = new ArrayList<SelectItem>(lista.size()+1);
		listaUI.add(new SelectItem(null,""));//para poder no seleccionar ninguno
		for(Proyecto p : lista){
			listaUI.add(new SelectItem(p.getIdProyecto(),p.getDescripcionProyecto()));
		}
		return listaUI;
	}
	
	public List<SelectItem> getPrioridadesUI(){
		
		List<SelectItem> listaUI = new ArrayList<SelectItem>(Prioridad.values().length+1);
		listaUI.add(new SelectItem(null,""));//para poder no seleccionar ninguno
		for(Prioridad p : Prioridad.values()){
			listaUI.add(new SelectItem(p.name(),p.name()));
		}
		return listaUI;
	}
	
	
	/**
	 * Devuelve las cateegorias del proyecto
	 * FIXME ahora devuelve todas, hay que hacer que en el 
	 * formulario de busqueda se cambie dinamicamente al cambiar el proyecto
	 * @return
	 */
	public List<SelectItem> getCategoriasUI(){
		Integer proyecto = null;
		if(isBuscando()){
			proyecto = getBusqueda().getIdProyecto();
		}
		else proyecto = getData().getIdProyecto();
		
		if(proyecto == null)	return new ArrayList<SelectItem>();
		List<CategoriaProyecto> lista = pm.categoriasProyecto(proyecto);
		
		List<SelectItem> listaUI = new ArrayList<SelectItem>(lista.size()+1);
		listaUI.add(new SelectItem(null,""));//para poder no seleccionar ninguno
		for(CategoriaProyecto p : lista){
			listaUI.add(new SelectItem(p.getIdCategoria(),p.getNombreCategoria()));
		}
		return listaUI;
	}
	


	public String insertarNota(){
		NotaTarea notaNueva = new NotaTarea();
		notaNueva.setIdUsuario(Sesion.getUsuario().getIdUsuario());
		notaNueva.setFechaAlta(new Date());
		notaNueva.setIdTarea(getData().getIdTarea());
		notaNueva.setTextoNota(textoActualNota);
		notaNueva.setIdProyecto(getData().getIdProyecto());
		tm.insertarNota(notaNueva);
		textoActualNota = ""; //reiniciado
		return null;
	}
	
	public List<NotaTarea> getNotasTareaActiva(){
		List<NotaTarea> listaNotas = null;
		if(getData().getIdTarea() != null){
			listaNotas = tm.getNotasTarea(getData().getIdTarea().intValue());
		}
		return listaNotas;
	}

	@Override
	public Tarea inicializarElementoNuevo() {
		Tarea t = new Tarea();
		Usuario usuarioActual = Sesion.getUsuario();
		t.setIdUsuarioAlta(usuarioActual.getIdUsuario());
		t.setIdUsuario(usuarioActual.getIdUsuario());
		return t;
	}
	
	public String getTextoActualNota() {
		return textoActualNota;
	}

	public void setTextoActualNota(String textoActualNota) {
		this.textoActualNota = textoActualNota;
	}

	@Override
	public boolean isPemisoAlta() {
		return true;
	}

	@Override
	public boolean isPermisoBorrado() {
		return true;
	}

	@Override
	public boolean isPermisoEdicion() {
		return true;
	}

	@Override
	public boolean isPermisoModulo() {
		return true;
	}

	
	


	
}
